上溢与下溢
一、无符号整数
表示范围( 位):
| 情况 | 触发条件 | 结果 |
|---|---|---|
| 上溢(Overflow) | 运算结果 | 最高位进位丢失,结果 |
| 下溢(Underflow) | 运算结果(减法借位) | 最高位借位丢失,结果 |
无符号整数没有”溢出检测”标志位的概念,CPU 用 进位标志 CF 来指示。
示例(8 位):
- ,存储为 ,CF = 1
- ,存储为 ,CF = 1
二、有符号整数(补码)
表示范围( 位):
| 情况 | 触发条件 | 判断方法 |
|---|---|---|
| 正溢出(上溢) | 两正数相加,结果 | 结果符号位为 1(变负) |
| 负溢出(下溢) | 两负数相加,结果 | 结果符号位为 0(变正) |
同符号相减不会溢出;异符号相加不会溢出。
溢出判断方法
方法一:双符号位法(变形补码)
用 2 位表示符号位:00 正,11 负;若出现 01 或 10,则溢出。
其中 为高位符号, 为低位符号, 表示溢出。
方法二:进位判断法
为最高位(符号位)的进位, 为次高位(数值最高位)的进位,两者不同则溢出。
示例(8 位):
- ,补码结果为 ,正溢出
- ,补码结果为 ,负溢出
三、浮点数
浮点数由阶码 E(指数)和尾数 M(有效值)组成,溢出分两类:
3.1 阶码溢出
| 情况 | 含义 | 表现 |
|---|---|---|
| 上溢(Exponent Overflow) | 阶码 最大值 | 数值超出可表示范围,结果为 |
| 下溢(Exponent Underflow) | 阶码 最小值 | 数值绝对值过小,通常归零处理(flush to zero) |
注意:浮点下溢 ≠ 负无穷,而是指数值太接近 0 无法表示,结果当作 0 处理。
3.2 IEEE 754 单精度(32 位)范围
| 区间 | 描述 |
|---|---|
| 上溢,结果为 | |
| 下溢,进入非规格化数(denormal)或归零 |
3.3 规格化与非规格化
- 规格化数:尾数形如 ,阶码在正常范围内。
- 非规格化数(Denormal):阶码全 0,尾数形如 ,用于填补下溢区间,精度逐渐降低(渐进下溢)。
- 归零(Flush to Zero):忽略非规格化数,直接置 0,损失精度但速度更快。
3.4 浮点溢出处理流程
运算结果
│
├─ 阶码 > 最大值 ──→ 上溢 → ±∞ / 报异常
│
├─ 阶码 < 最小值 ──→ 下溢 → 非规格化数 / 归零 / 报异常
│
└─ 阶码正常,尾数规格化 ──→ 正常结果
四、对比总结
| 类型 | 上溢(Overflow) | 下溢(Underflow) |
|---|---|---|
| 无符号整数 | 结果,CF=1 | 结果,CF=1 |
| 有符号整数 | 正数变负,OF=1 | 负数变正,OF=1 |
| 浮点数 | 趋向 | 趋向 0(非规格化 / 归零) |